/**
 * 颜色分配工具函数
 */

// 预定义的课程颜色调色板，确保视觉区分度
export const COLOR_PALETTE = [
  '#3B82F6', // 蓝色
  '#EF4444', // 红色
  '#10B981', // 绿色
  '#F59E0B', // 黄色
  '#8B5CF6', // 紫色
  '#EC4899', // 粉色
  '#14B8A6', // 青色
  '#F97316', // 橙色
  '#6366F1', // 靛蓝
  '#84CC16', // 青柠绿
  '#F43F5E', // 玫瑰红
  '#06B6D4'  // 天蓝色
];

/**
 * 根据课程索引和位置获取颜色，确保相邻10个单元格内无重复颜色
 * @param courseIndex 课程索引
 * @param dayIndex 星期几索引 (0-6)
 * @param sectionIndex 节次索引 (0-5)
 * @param usedColors 已使用的颜色映射
 * @returns 分配的颜色
 */
export const getCourseColor = (
  courseIndex: number,
  dayIndex: number,
  sectionIndex: number,
  usedColors: Map<string, string>
): string => {
  // 检查相邻10个单元格的颜色使用情况
  const adjacentPositions = getAdjacentPositions(dayIndex, sectionIndex);
  const usedAdjacentColors = new Set<string>();
  
  adjacentPositions.forEach(pos => {
    const key = `${pos.day}-${pos.section}`;
    const color = usedColors.get(key);
    if (color) {
      usedAdjacentColors.add(color);
    }
  });
  
  // 从调色板中找到第一个未在相邻位置使用的颜色
  for (let i = 0; i < COLOR_PALETTE.length; i++) {
    const colorIndex = (courseIndex + i) % COLOR_PALETTE.length;
    const color = COLOR_PALETTE[colorIndex];
    
    if (!usedAdjacentColors.has(color)) {
      return color;
    }
  }
  
  // 如果所有颜色都被使用，返回基于索引的颜色
  return COLOR_PALETTE[courseIndex % COLOR_PALETTE.length];
};

/**
 * 获取指定位置相邻的10个单元格位置
 * @param dayIndex 星期几索引 (0-6)
 * @param sectionIndex 节次索引 (0-5)
 * @returns 相邻位置数组
 */
const getAdjacentPositions = (dayIndex: number, sectionIndex: number) => {
  const positions: Array<{ day: number; section: number }> = [];
  
  // 检查左右各5列的范围
  for (let d = Math.max(0, dayIndex - 5); d <= Math.min(6, dayIndex + 5); d++) {
    // 检查上下相邻的节次
    for (let s = Math.max(0, sectionIndex - 1); s <= Math.min(5, sectionIndex + 1); s++) {
      if (d !== dayIndex || s !== sectionIndex) {
        positions.push({ day: d, section: s });
      }
    }
  }
  
  return positions;
};

/**
 * 将十六进制颜色转换为RGB
 * @param hex 十六进制颜色值
 * @returns RGB对象
 */
export const hexToRgb = (hex: string): { r: number; g: number; b: number } | null => {
  const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
  return result ? {
    r: parseInt(result[1], 16),
    g: parseInt(result[2], 16),
    b: parseInt(result[3], 16)
  } : null;
};

/**
 * 根据背景颜色获取合适的文字颜色
 * @param backgroundColor 背景颜色
 * @returns 文字颜色（白色或黑色）
 */
export const getTextColor = (backgroundColor: string): string => {
  const rgb = hexToRgb(backgroundColor);
  if (!rgb) return '#000000';
  
  // 计算亮度
  const brightness = (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;
  return brightness > 128 ? '#000000' : '#FFFFFF';
};

/**
 * 获取颜色的浅色版本（用于悬停效果）
 * @param color 原始颜色
 * @param opacity 透明度
 * @returns 浅色版本
 */
export const getLightColor = (color: string, opacity: number = 0.1): string => {
  const rgb = hexToRgb(color);
  if (!rgb) return color;
  
  return `rgba(${rgb.r}, ${rgb.g}, ${rgb.b}, ${opacity})`;
};
